package io.hilo.example.biz01.common;

import org.hilo.boot.core.UT;
import org.jretty.apibase.IMsg;

/**
 * 项目子域下公共的异常代码定义
 * 
 * <p>
 * 很强大的功能： ----可以根据code定位到对应的错误信息（每个code都唯一）
 * <p>
 * ReadMe： ----每一条错误信息应该包括：错误代码和注释。
 * <p>
 * ----错误代码（code）命名规范如下： 总长度在30以内，易于区别错误所属的模块(或类型)，字母后面可以跟3~4个数字
 * <p>
 * ----特别提醒：
 * 
 * 一定要写注释，方便自己和别人快速查看！ 代码格式保持统一！
 */
public enum MsgBiz01 implements IMsg {
    
    // 用法示例：
    // 可自定义code，例如下面的QX_系列，100701，100702
    // 也可以根据消息内容，自动生成code，例如下面的USR_系列（生成的格式为6位字母和数字的组合
    
    
    // USR开头 -- User相关的错误信息（code自动生成）
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /** 手机号或密码错误 */
    USR_PASSWD_INVALID("手机号或密码错误"),
    /** 新密码不为能空 */
    USR_NEW_PASSWD_EMPTY("新密码不为能空"),
    /** 手机号不能为空 */
    USR_MOBILE_EMPTY("手机号不能为空"),
    /** 密码不能为空 */
    USR_PASSWD_EMPTY("密码不能为空"),
    
    // MENU开头 -- Menu相关的错误信息
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /** 菜单名称不能为空 */
    MENU_NAME_EMPTY("菜单名称不能为空"),
    /** 上级菜单不能为空 */
    MENU_PARENT_EMPTY("上级菜单不能为空"),
    /** 菜单URL不能为空 */
    MENU_URL_EMPTY("菜单URL不能为空"),
    /** 上级菜单只能为目录类型 */
    MENU_PARENT_ONLY_BE_DIR("上级菜单只能为目录类型"),
    /** 上级菜单只能为菜单类型 */
    MENU_PARENT_ONLY_BE_MENU("上级菜单只能为菜单类型"),
    
    // TOKEN开头 -- Token相关的错误信息
    //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    /** token失效，请重新登录 */
    TOKEN_INVALID("token失效，请重新登录"),
    
    ;
    
    private String msgZhCN;
    
    private String msgEnUS;
    
    private String msgZhTW;
    
    private String code;
    
    
    /** 
     * 构造函数
     */
    private MsgBiz01(String msgZhCN) {
        this.msgZhCN = msgZhCN;
        this.code = newCode(this.name(), msgZhCN);
    }
    
    /** 
     * 构造函数
     */
    private MsgBiz01(String code, String msgZhCN) {
        this.code = code;
        this.msgZhCN = msgZhCN;
    }
    
    /** 
     * 构造函数
     */
    private MsgBiz01(String msgZhCN, String msgEnUS, String msgZhTW) {
        this.msgZhCN = msgZhCN;
        this.msgEnUS = msgEnUS;
        this.msgZhTW = msgZhTW;
        this.code = newCode(this.name(), getMsg());
    }
    
    /** 
     * 构造函数
     */
    private MsgBiz01(String code, String msgZhCN, String msgEnUS, String msgZhTW) {
        this.code = code;
        this.msgZhCN = msgZhCN;
        this.msgEnUS = msgEnUS;
        this.msgZhTW = msgZhTW;
    }
    
    /**
     * @return Returns the code.
     */
    @Override
    public String getCode() {
        return code;
    }
    
    @Override
    public String getMsg() {
        if (msgZhCN != null) {
            return msgZhCN;
        }
        if (msgEnUS != null) {
            return msgEnUS;
        }
        if (msgZhTW != null) {
            return msgZhTW;
        }
        return "";
    }
    
    @Override
    public String getMsg(String locale) {
        if ("zh_CN".equals(locale)) {
            return msgZhCN;
        }

        if ("en_US".equals(locale)) {
            return msgEnUS;
        }

        if ("zh_TW".equals(locale)) {
            return msgZhTW;
        }

        return getMsg();
    }
    
    @Override
    public String toString(){
        return code + "=[" + this.name() + "] " + getMsg();
    }
    
    @Override
    public String toString(String local){
        return code + "=[" + this.name() + "] " + getMsg(local);
    }

    private static String newCode(String name, String errorMsg) {
        return UT.Algr.shortMsg(name + errorMsg);
    }
}

